import numpy as np
# from scipy.stats import truncnorm
import sys
import pandas as pd

# sys.path.append('D:/gitee/python-script-new/papertools/')

# 导入 pappertool 包中的 common_functions 模块
from paper_tool.papertools import common_functions


def truncated_normal(mean, variance, num, min_value, max_value):
    random_numbers = np.random.normal(mean, np.sqrt(variance), num)

    # 调整随机数的平均数
    current_mean = np.mean(random_numbers)
    adjustment = mean - current_mean
    random_numbers += adjustment

    # 将超出范围的值截断到最小值和最大值之间
    random_numbers = np.clip(random_numbers, min_value, max_value)

    return random_numbers



# 使用scipy.stats.truncnorm来生成截断的正态分布。这个函数可以让你指定上下限，以及均值和标准差。

# 定义截断正态分布的参数
""" lower, upper = 1, 5
mean_values = [4.5, 4.2, 4.3, 4.2, 3.8]
std_devs = [0.4, 0.5, 0.5, 0.6, 0.3]  # 每个维度的标准差

# 定义维度的名称
dimensions = ['Reliability', 'Responsiveness', 'Assurance', 'Empathy', 'Tangibles'] """

def main_init(mean_values,std_devs,dimensions,excel_filename,sheet_save_name='sheet1',lower=1.1,upper = 4.9):
    # 创建一个名为 random_data 的新数据框（DataFrame），并将其赋值为空数据框。
    random_data = pd.DataFrame()

    for index, col in enumerate(dimensions):
        temp_data = pd.DataFrame()

        # 使用 generate_array_with_average 生成数组
        temp_numbers_arr = truncated_normal(mean_values[index],std_devs[index], 5,lower,upper)

        # 将生成的数组作为一行数据添加到 temp_data
        temp_data = pd.concat([temp_data, pd.DataFrame([temp_numbers_arr], columns=[f'{col}_{i+1}' for i in range(5)])], ignore_index=True)
    

        # 使用pd.concat函数将temp_data与random_data进行水平拼接（axis=1表示水平拼接），并将结果存储在random_data中。这样，随着每个i的迭代，random_data将逐渐增长，包含了多次复制原始数据的列，每一列都有不同的列名。
        random_data = pd.concat([random_data, temp_data], axis=1)

    # 将数据保存到Excel文件

    # 使用上下文管理器创建Excel writer对象，mode='a'表示附加模式
    with pd.ExcelWriter(excel_filename, engine='openpyxl', mode='w') as writer:
        # 将数据保存到指定表格（output_sheet_name）
        random_data.to_excel(writer, sheet_name=sheet_save_name, index=False)


    print(f'Data saved to {excel_filename} : {sheet_save_name}')

    return excel_filename
